/*
 * Titulo: SimpleList.java
 * Autor: Oswaldo Ceballos Zavala
 * Descripcion: Lista simplemente ligada parametriza
 * 
 * Universidad Autonoma de Yucatan
 * 
 */
package aerodromo.util.estructurasDatos.lista;

/**
 *
 * @author Oswaldo.C, Diego Martínez
 */
public class SimpleList<T> 
        extends List<T>{

    
    @Override
    public void insertAtFirst(T element) {
     
    if (isEmpty()){
      
         ListNode<T> nuevo = new ListNode<T>( element );
         firstNode = lastNode = nuevo;
        
    }
    else{
      ListNode<T> nuevo = new ListNode<T>( element, firstNode );
      firstNode = nuevo;
    }
    
    tam++;
    
    }

    
    @Override
    public void insertAtLast(T element) {
        if(isEmpty()){
           ListNode<T> nuevo = new ListNode<T>( element );
           firstNode = lastNode = nuevo;   
        }
        else{
            ListNode<T> nuevo = new ListNode<T>( element );
            lastNode.next = nuevo;
            lastNode = nuevo;
        }
        tam++;
    }

    @Override
    public T removeFromFisrt() throws EmptyListException {
        
        //si la lista esta vacia
        if( isEmpty() ){
            throw new EmptyListException();
        }
        
        T removedItem = firstNode.getData();
        
        //si la lista solo tiene un elemento
        if( firstNode == lastNode ){
            firstNode = lastNode = null;
        }
        //si la lista tiene mas de un elemento
        else{
            firstNode = firstNode.next;
        }
        
        tam--;
        return removedItem;
    }

    @Override
    public T removeFromLast() throws EmptyListException {
        
        //si la lista esta vacia
        if(isEmpty()){
            throw new EmptyListException();
        }
        
        T removedItem = lastNode.getData();
        
        //si solo tiene un elemento
        if( firstNode == lastNode ){
            firstNode = lastNode = null;
        }
        //si tiene mas de un elemento
        else{
            ListNode<T> current = firstNode;
            
            while( current.getSiguiente() != lastNode ){
                current = current.getSiguiente();
            }
            
            lastNode = current;
            current.setSiguiente(null);
        }
        
        tam--;
        return  removedItem;
    
    }

    @Override
    public T obtenerdeIndice(int indice) {
        ListNode<T> current = firstNode;
        while(indice!=0){
            current= current.getSiguiente();
            indice--;
        }
        return (T) current;
    }
 
    
} //fin clase SimpleList
